/**
 * Software License, Version 1.0
 * 
 * Copyright 2008 The Trustees of Indiana University.  All rights reserved.
 * 
 *
 *Redistribution and use in source and binary forms, with or without 
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the 
 * following acknowledgment:
 *
 *"This product includes software developed by the Community Grids Lab. For 
 * further information contact the Community Grids Lab at 
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgment may appear in the software itself, and 
 * wherever such third-party acknowledgments normally appear.
 * 
 *4) The name Indiana University or Community Grids Lab or Granules, 
 * shall not be used to endorse or promote products derived from this software 
 * without prior written permission from Indiana University.  For written 
 * permission, please contact the Advanced Research and Technology Institute 
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called Granules, 
 * nor may Indiana University or Community Grids Lab or Granules appear
 * in their name, without prior written permission of ARTI.
 * 
 *
 * Indiana University provides no reassurances that the source code provided 
 * does not infringe the patent or any other intellectual property rights of 
 * any other entity.  Indiana University disclaims any liability to any 
 * recipient for claims brought by any other entity based on infringement of 
 * intellectual property rights or otherwise.  
 *
 * LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO 
 * WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 * NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF 
 * INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. 
 * INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", 
 * "VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.  
 * LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR 
 * ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION 
 * GENERATED USING SOFTWARE.
 */
package cgl.granules.samples.bioinf;

import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Properties;

import cgl.granules.dataset.Dataset;
import cgl.granules.dataset.DatasetCollection;
import cgl.granules.dataset.DatasetException;
import cgl.granules.dataset.FileAccess;
import cgl.granules.operation.MapReduceBase;
import cgl.granules.results.ResultPayload;
import cgl.granules.util.SystemCommand;

/**
 * This map is a component within a bio informatics application that uses CAP3
 * to assemble mRNA sequences.
 * 
 * @author Shrideep Pallickara
 */

public class ClusterMap extends MapReduceBase {

    private ResultPayload resultPayload;
    private String directoryInformation = ".";

    private boolean debug = true;
    private String workerType = "Unknown ";
   


    public ClusterMap() {
        setDomain("Generic");
        setVersionInformation(200);
        setOperationIdentifier("BioInf-MapFunction-GranulesSample");
        resultPayload = ResultPayload.getInstance();
    }


    public void execute() {
        Properties props = getProcessingDirectives();

        String property = "Worker Number";
        if (props.containsKey(property)) {
            workerType = property + props.getProperty(property);
        }

        String directoryProperty = "Directory";
        if (props.containsKey(directoryProperty)) {
            directoryInformation = props.getProperty(directoryProperty);
        }

        int workUnits = 0;
        if (!hasDatasetCollection()) {
            System.out.println("No dataset has been initialized. Returning ...");
            return;
        }

        String datasetIdentifier = "FileDataset-ID-BioInf";
        DatasetCollection datasetCollection = getDatasetCollection();
        FileAccess access = null;
        try {
            Dataset dataset = datasetCollection.getDataset(datasetIdentifier);

            if (dataset.getDatasetType() == Dataset.FILES) {
                access = (FileAccess) dataset;
            } else {
                System.out.println("Incorrect datatset: "
                    + dataset.getDatasetType() + " initialized. Returning ...");
                return;
            }

            if (access == null) {
                System.out.println("Unable to initialize the dataset");
                return;
            }

            Enumeration filenames = access.getFilenames();

            while (filenames.hasMoreElements()) {
                String filename = (String) filenames.nextElement();
                int code = executeSystemCommand(filename);
                if (code == 0) {
                    // System.out.println("Success for file: " + filename);
                } else {
                    System.out.println("Failure for file: " + filename);
                }
            }

            setTeminationConditionReached();

        } catch (DatasetException e) {
            System.out.println("ClusterMap: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("ClusterMap: " + e.getMessage());
        } catch (InterruptedException e) {
            System.out.println("ClusterMap: " + e.getMessage());
        }
    }


    private int executeSystemCommand(String filename) throws IOException,
        InterruptedException {
        File dir = new File(directoryInformation);
        SystemCommand command = new SystemCommand();
        // String sysCommand = "ls -al " + filename;
        // String sysCommand = "cmd /c dir " + filename;
        String sysCommand = "cap3 " + filename + " -p 95 -o 49 -t 100";

        int code = command.executeCommand(sysCommand, null, dir, debug);

        return code;
    }

}
